/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.seguridad.controlador;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.sql.SQLMenuModelo;
import sv.com.intesal.seguridad.sql.SQLMenuUsuario;

/**
 *
 * @author ejerez
 */
public class MenuModelControlador {

    public MenuModel prueba() throws Exception {

        MenuModel model;
        try {
            model = new DefaultMenuModel();

            //First submenu
            Submenu submenu = new Submenu();
            submenu.setLabel("Dynamic Submenu 1");

            MenuItem item = new MenuItem();
            item.setValue("Dynamic Menuitem 1.1");
            item.setUrl("#");
            submenu.getChildren().add(item);

            model.addSubmenu(submenu);

            //Second submenu
            submenu = new Submenu();
            submenu.setLabel("Dynamic Submenu 2");

            item = new MenuItem();
            item.setValue("Dynamic Menuitem 2.1");
            item.setUrl("#");
            submenu.getChildren().add(item);

            item = new MenuItem();
            item.setValue("Dynamic Menuitem 2.2");
            item.setUrl("#");
            submenu.getChildren().add(item);

            model.addSubmenu(submenu);
            System.out.println("model= " + model.getMenuItems());
            return model;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public MenuModel getMenu_x_Usuario() throws Exception {
        try {
            MenuModel model = new DefaultMenuModel();

            ResultSet rs = this.getParents();
            while (rs.next()) {
                Submenu submenu = new Submenu();
                if (this.getValidar_Childs(rs.getInt("codigo_m")) == true) {
                    /*obtiene submenu*/
                    submenu.setLabel(rs.getString("nombre_m"));
                    //model.addSubmenu(submenu);
                    model.addSubmenu(this.getChildSubMenu(submenu, rs.getInt("codigo_m")));
                } else {
                    /*obtiene menuitem cunado esta solo*/
                    model.addMenuItem(this.getChildMenuItem(rs.getInt("codigo_m")));
                }
            }
            return model;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private Submenu getChildSubMenu(Submenu sm, Integer codigo_m) throws Exception {
        Submenu submenu = null;
        try {
            ResultSet rs = this.getChilds(codigo_m);
            while (rs.next()) {
                if (this.getValidar_Childs(rs.getInt("codigo_m")) == true) {
                    submenu = new Submenu();
                    submenu.setLabel(rs.getString("nombre_m"));
                    this.getChildSubMenu(submenu, rs.getInt("codigo_m"));
                } else {
                    sm.getChildren().add(this.getChildMenuItem(rs.getInt("codigo_m")));
                }
                if (submenu != null) {
                    sm.getChildren().add(submenu);
                }
            }
            return sm;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private ResultSet getParents() throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMenuModelo.getMenu_x_Usuario_inicial);
            ResultSet rs = ps.executeQuery();
            return rs;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private ResultSet getChilds(Integer codigo_m) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMenuModelo.getMenu_x_Usuario_final);
            ps.setInt(1, codigo_m);
            ResultSet rs = ps.executeQuery();
            return rs;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private ResultSet getMenu_x_Codigo(Integer codigo_m) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMenuModelo.getMenu_x_Codigo);
            ps.setInt(1, codigo_m);
            ResultSet rs = ps.executeQuery();
            return rs;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private MenuItem getChildMenuItem(Integer codigo_m) throws Exception {
        MenuItem item = new MenuItem();
        try {
            ResultSet rs = this.getMenu_x_Codigo(codigo_m);
            while (rs.next()) {
                item.setValue(rs.getString("nombre_m"));

                /*
                 *Se tiene que evaluar si en el url viene null o vacio, ya que sino devuelve un error de:
                 * "String index out of range: 0"
                 */
                if (rs.getString("url_m").toString() == null) {
                    item.setUrl("#");
                } else if (rs.getString("url_m").equals("")) {
                    item.setUrl("#");
                } else {
                    item.setUrl(rs.getString("url_m"));
                }
            }
            return item;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    /**
     * getValidar_Childs return false es porque no tiene hijos.
     * si devuelve true es porque si tiene hijos
     * Generar Reporte de Cuentas por Pagar.
     * @return Boolean
     * @exception Exception
     */
    private Boolean getValidar_Childs(Integer codigo_papa_m) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMenuModelo.getMenu_x_Usuario_validar);
            ps.setInt(1, codigo_papa_m);
            ResultSet rs = ps.executeQuery();
            rs.next();
            if (rs.getInt("contar") == 0) {
                return false;
            }
            return true;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}